Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: accoil analytics ui #1807

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from

Conversation

accoilmj
Copy link

@accoilmj accoilmj commented Nov 19, 2024

What are the changes introduced in this PR?

Adds new UI for 'Accoil Analytics' destination.

Please explain the objectives of your changes below

Adds UI for Accoil Analytics.

Destination code PR: rudderlabs/rudder-transformer#3873
Documentation PR: rudderlabs/rudderstack-docs#1196

Any changes to existing capabilities/behaviour, mention the reason & what are the changes ?

N/A

Any new dependencies introduced with this change?

N/A

Any new checks got introduced or modified in test suites. Please explain the changes.

N/A


Developer checklist

  • My code follows the style guidelines of this project

  • No breaking changes are being introduced.

  • All related docs linked with the PR?

  • All changes manually tested?

  • Any documentation changes needed with this change?

  • I have executed schemaGenerator tests and updated schema if needed

  • Are sensitive fields marked as secret in definition config?

  • My test cases and placeholders use only masked/sample values for sensitive fields

  • Is the PR limited to 10 file changes & one task?

Reviewer checklist

  • Is the type of change in the PR title appropriate as per the changes?

  • Verified that there are no credentials or confidential data exposed with the changes.

Summary by CodeRabbit

Release Notes

  • New Features
    • Introduced a new configuration file for Accoil Analytics, allowing users to manage analytics settings more effectively.
    • Added a comprehensive JSON schema to validate configuration inputs, ensuring all necessary properties are included.
    • Launched a user interface configuration file that simplifies the setup process, including sections for connection and consent settings.
    • Implemented templates for managing user input related to connection and consent settings.

These updates enhance user experience and streamline the integration of Accoil Analytics.

Copy link

coderabbitai bot commented Nov 19, 2024

Walkthrough

The pull request introduces three new JSON configuration files for the Accoil Analytics destination: db-config.json, schema.json, and ui-config.json. These files define various settings, validation schemas, and user interface configurations necessary for integrating with the Accoil Analytics platform. The configurations include properties for API keys, consent management, supported platforms, and connection modes, ensuring a structured approach to handling analytics settings.

Changes

File Path Change Summary
src/configurations/destinations/accoil_analytics/db-config.json New configuration file added with properties for destination settings, supported platforms, and keys.
src/configurations/destinations/accoil_analytics/schema.json New JSON schema file added defining validation rules for configuration properties, including apiKey.
src/configurations/destinations/accoil_analytics/ui-config.json New UI configuration file added with settings for user input, consent management, and templates.

Possibly related PRs

Suggested reviewers

  • lvrach
  • am6010
  • AchuthaSourabhC
  • krishna2020
  • debanjan97
  • cisse21
  • ruchiramoitra
  • 1abhishekpandey
  • ItsSudip
  • sandeepdsvs

🐇 In the fields of code, we hop and play,
With new configs to guide our way.
For Accoil Analytics, we set the stage,
A structured dance on the techie page!
So let’s configure, connect, and cheer,
For every change brings us near! 🎉


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (7)
src/configurations/destinations/accoil_analytics/db-config.json (2)

14-14: Consider documenting the empty excludeKeys array

The excludeKeys array is empty. If this is intentional, consider adding a comment in the documentation PR (rudderlabs/rudderstack-docs#1196) explaining why no keys need to be excluded for this destination.


44-115: Consider reducing configuration duplication

The platform-specific configurations contain identical settings for most platforms. Consider refactoring to use a common configuration template to improve maintainability.

 "destConfig": {
   "defaultConfig": ["apiKey", "blacklistedEvents", "whitelistedEvents", "eventFilteringOption"],
+  "commonConfig": [
+    "connectionMode",
+    "consentManagement",
+    "oneTrustCookieCategories",
+    "ketchConsentPurposes"
+  ],
   "web": [
     "useNativeSDK",
-    "connectionMode",
-    "consentManagement",
-    "oneTrustCookieCategories",
-    "ketchConsentPurposes"
+    ...commonConfig
   ],
   // Apply similar pattern to other platforms
src/configurations/destinations/accoil_analytics/ui-config.json (3)

60-64: Clarify purpose of empty SDK Template.

The SDK template section is marked as "not visible in the ui" and contains no fields. If this section is not needed, consider removing it to avoid confusion in future maintenance.


81-92: Simplify duplicate feature flag conditions.

The OneTrust and Ketch sections have identical feature flag conditions. Consider extracting these to a shared configuration to improve maintainability.

+ "consentFeatureFlags": {
+   "featureFlags": [
+     {
+       "configKey": "AMP_enable-gcm",
+       "value": false
+     },
+     {
+       "configKey": "AMP_enable-gcm"
+     }
+   ],
+   "featureFlagsCondition": "or"
+ },

Then reference this shared configuration in both sections.

Also applies to: 106-117


172-173: Fix inconsistent apostrophe usage.

Change ID's to IDs for consistency with other occurrences in the file.

-"label": "Enter consent category ID's",
+"label": "Enter consent category IDs",
src/configurations/destinations/accoil_analytics/schema.json (2)

7-10: Consider strengthening the API key pattern validation

The current pattern (^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{1,100})$ allows any string up to 100 characters. Consider adding more specific validation for the API key format to prevent invalid keys.

       "apiKey": {
         "type": "string",
-        "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{1,100})$"
+        "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^([a-zA-Z0-9_-]{32,100})$",
+        "description": "Accoil Analytics API key. Must be 32-100 characters long and contain only alphanumeric characters, underscores, and hyphens."
       }

845-858: Consider adding validation for native SDK configuration

The useNativeSDK configuration lacks constraints that might be important:

  1. No default values are specified
  2. No description of the implications of enabling/disabling native SDK
  3. No validation to ensure consistent settings across platforms
    "useNativeSDK": {
      "type": "object",
+     "description": "Configuration for native SDK usage per platform",
      "properties": {
        "web": {
-         "type": "boolean"
+         "type": "boolean",
+         "default": false,
+         "description": "Enable/disable native SDK for web platform"
        },
        "android": {
-         "type": "boolean"
+         "type": "boolean",
+         "default": false,
+         "description": "Enable/disable native SDK for Android platform"
        },
        "ios": {
-         "type": "boolean"
+         "type": "boolean",
+         "default": false,
+         "description": "Enable/disable native SDK for iOS platform"
        }
      }
    }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between a039627 and 20993ae.

📒 Files selected for processing (3)
  • src/configurations/destinations/accoil_analytics/db-config.json (1 hunks)
  • src/configurations/destinations/accoil_analytics/schema.json (1 hunks)
  • src/configurations/destinations/accoil_analytics/ui-config.json (1 hunks)
🔇 Additional comments (9)
src/configurations/destinations/accoil_analytics/db-config.json (5)

116-120: LGTM! Security configuration and beta status are properly set

The API key is correctly marked as secret and the beta status is appropriately indicated.


28-30: Verify supported message types configuration

Message types are only defined for the "cloud" source. Please verify if this is intentional and aligns with the destination implementation in rudderlabs/rudder-transformer#3873.

#!/bin/bash
# Check message type configurations in other destinations
rg -A 5 '"supportedMessageTypes"' src/configurations/destinations/

47-47: Verify native SDK support configuration

The useNativeSDK option is only available for web, android, and ios platforms. Please verify this aligns with the actual SDK capabilities in the destination implementation (rudderlabs/rudder-transformer#3873).

#!/bin/bash
# Check native SDK support patterns in other destinations
rg '"useNativeSDK"' src/configurations/destinations/

Also applies to: 54-54, 61-61


1-121: Verify schema validation

Please ensure that the configuration aligns with the validation rules defined in the accompanying schema.json file, particularly for required fields and value constraints.

✅ Verification successful

Configuration validated successfully

The db-config.json aligns perfectly with the schema.json requirements:

  • Required apiKey field is present in the defaultConfig
  • All optional fields (oneTrustCookieCategories, connectionMode, consentManagement, ketchConsentPurposes) are properly structured
  • Connection modes are correctly set to "cloud" across all platforms
  • Platform-specific configurations follow the defined schema patterns
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Find and check the corresponding schema file
fd -t f schema.json src/configurations/destinations/accoil_analytics/

Length of output: 24843


Script:

#!/bin/bash
# Let's check the schema file for Accoil Analytics specifically
cat src/configurations/destinations/accoil_analytics/schema.json

Length of output: 25654


7-7: Verify privacy implications of saving destination responses

The configuration enables saving destination responses. Please ensure this doesn't inadvertently store sensitive user data or PII.

✅ Verification successful

Saving destination responses is a common and safe practice

The search results show that saveDestinationResponse is a standard configuration used across many destinations, with most destinations having it enabled (true). This is a built-in feature of the platform that helps with debugging and monitoring integrations. Only a few destinations like GA4, Firebase, GTM, and Pinterest Tag explicitly disable this feature.

The configuration follows the established pattern and doesn't introduce any privacy concerns as:

  1. It's a system-level configuration for debugging purposes
  2. The platform has built-in controls through includeKeys and excludeKeys to manage what data gets saved
  3. Many sensitive destinations (payment, analytics, etc.) safely use this configuration
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check other destinations for similar settings and any associated privacy controls
rg -l "saveDestinationResponse.*true" src/configurations/destinations/

Length of output: 24843


Script:

#!/bin/bash
# Let's search for saveDestinationResponse configuration in other destinations
rg -A 2 '"saveDestinationResponse"' src/configurations/destinations/

Length of output: 63033

src/configurations/destinations/accoil_analytics/ui-config.json (3)

50-56: Verify empty consent settings section.

The consent settings section has an empty groups array, while detailed consent configurations exist in consentSettingsTemplate. Consider:

  1. Either removing this empty section if it's not needed
  2. Or moving the relevant groups from consentSettingsTemplate here
#!/bin/bash
# Check if other destinations follow similar pattern
fd -e json -x jq -r 'select(.uiConfig.baseTemplate[].sections[].id == "consentSettings") | input_filename' {} \; 2>/dev/null

184-191: ⚠️ Potential issue

Review conflicting feature flag conditions.

The feature flag AMP_enable-gcm appears with different values across the file:

  • false in OneTrust/Ketch sections
  • true in the dynamicCustomForm section

This could lead to unexpected behavior where some consent management features are hidden while others are visible.

#!/bin/bash
# Check for other occurrences of this feature flag
rg -l "AMP_enable-gcm" | xargs jq -r 'paths as $p | select(getpath($p) == "AMP_enable-gcm") | $p | join(".")'

39-40: ⚠️ Potential issue

Connection mode section requires configuration.

The fields array is empty, but the section is present with a title and note. This could lead to confusion as users might expect configuration options here.

src/configurations/destinations/accoil_analytics/schema.json (1)

796-844: Verify connection mode constraints

The connection mode is restricted to "cloud" for all platforms. Verify if this is intentional and if other modes might be needed in the future.

✅ Verification successful

Connection mode restriction is appropriate for this destination

The "cloud" only restriction for all platforms in accoil_analytics is consistent with most other destinations. While Adobe Analytics supports both "cloud" and "device" modes for some platforms, this appears to be an exception rather than the norm. Other major destinations like Zendesk, Salesforce, and Snowflake also restrict their connection modes to "cloud" only, indicating this is a standard pattern.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if other destinations support additional connection modes

# Search for connection mode configurations in other destination schemas
fd . src/configurations/destinations -e json -x grep -l "connectionMode"

Length of output: 23737


Script:

#!/bin/bash
# Let's check the connection mode configurations in other destination schemas
# We'll sample a few schemas to see if they have different connection modes

# Check Adobe Analytics schema
echo "=== Adobe Analytics Connection Mode ==="
rg -A 10 '"connectionMode":\s*{' src/configurations/destinations/adobe_analytics/schema.json

echo -e "\n=== Zendesk Connection Mode ==="
rg -A 10 '"connectionMode":\s*{' src/configurations/destinations/zendesk/schema.json

echo -e "\n=== Salesforce Connection Mode ==="
rg -A 10 '"connectionMode":\s*{' src/configurations/destinations/salesforce/schema.json

echo -e "\n=== Snowflake Connection Mode ==="
rg -A 10 '"connectionMode":\s*{' src/configurations/destinations/snowflake/schema.json

Length of output: 1120


Script:

#!/bin/bash
# Let's fix the regex and check connection modes in other destination schemas

# Check Adobe Analytics schema
echo "=== Adobe Analytics Connection Mode ==="
rg -A 10 '"connectionMode"' src/configurations/destinations/adobe_analytics/schema.json

echo -e "\n=== Zendesk Connection Mode ==="
rg -A 10 '"connectionMode"' src/configurations/destinations/zendesk/schema.json

echo -e "\n=== Salesforce Connection Mode ==="
rg -A 10 '"connectionMode"' src/configurations/destinations/salesforce/schema.json

echo -e "\n=== Snowflake Connection Mode ==="
rg -A 10 '"connectionMode"' src/configurations/destinations/snowflake/schema.json

Length of output: 1752

@accoilmj accoilmj force-pushed the accoil-analytics-destination-ui branch from 20993ae to cfcf256 Compare November 19, 2024 01:26
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (1)
src/configurations/destinations/accoil_analytics/schema.json (1)

796-844: Simplify connection mode configuration

The connection mode configuration can be simplified since all platforms use the same "cloud" enum.

Apply this refactor:

{
  "configSchema": {
    "properties": {
      "connectionMode": {
        "type": "object",
+       "additionalProperties": {
+         "type": "string",
+         "enum": ["cloud"]
+       },
        "properties": {
-         "cloud": {
-           "type": "string",
-           "enum": ["cloud"]
-         },
-         "android": {
-           "type": "string",
-           "enum": ["cloud"]
-         },
          // ... remove all platform-specific definitions
        }
      }
    }
  }
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 20993ae and cfcf256.

📒 Files selected for processing (3)
  • src/configurations/destinations/accoil_analytics/db-config.json (1 hunks)
  • src/configurations/destinations/accoil_analytics/schema.json (1 hunks)
  • src/configurations/destinations/accoil_analytics/ui-config.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/configurations/destinations/accoil_analytics/db-config.json
  • src/configurations/destinations/accoil_analytics/ui-config.json
🔇 Additional comments (4)
src/configurations/destinations/accoil_analytics/schema.json (4)

1-10: LGTM: Root schema and API key configuration

The schema version and API key validation are properly configured. The pattern allows for environment variables and template strings while limiting the key length to 100 characters.


845-858: LGTM: Native SDK configuration

The Native SDK configuration is well-structured and appropriately limited to web, android, and ios platforms.


11-147: 🛠️ Refactor suggestion

Reduce code duplication in platform configurations

The OneTrust cookie categories configuration is identical across all platforms, leading to significant code duplication.

Apply this refactor to improve maintainability:

{
  "configSchema": {
    "$schema": "http://json-schema.org/draft-07/schema#",
+   "definitions": {
+     "oneTrustCookieCategory": {
+       "type": "array",
+       "items": {
+         "type": "object",
+         "properties": {
+           "oneTrustCookieCategory": {
+             "type": "string",
+             "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$"
+           }
+         }
+       }
+     }
+   },
    "properties": {
      "oneTrustCookieCategories": {
        "type": "object",
        "properties": {
-         "cloud": {
-           "type": "array",
-           "items": {
-             "type": "object",
-             "properties": {
-               "oneTrustCookieCategory": {
-                 "type": "string",
-                 "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$"
-               }
-             }
-           }
-         },
+         "cloud": { "$ref": "#/definitions/oneTrustCookieCategory" },
+         "android": { "$ref": "#/definitions/oneTrustCookieCategory" },
          // ... repeat for other platforms
        }
      }
    }
  }
}

285-795: 🛠️ Refactor suggestion

Improve consent management configuration structure

The consent management configuration has significant duplication and could be better structured.

Apply this refactor:

{
  "configSchema": {
    "definitions": {
+     "consentConfig": {
+       "type": "object",
+       "properties": {
+         "provider": {
+           "type": "string",
+           "enum": ["custom", "ketch", "oneTrust"],
+           "default": "oneTrust"
+         },
+         "consents": {
+           "type": "array",
+           "items": {
+             "type": "object",
+             "properties": {
+               "consent": {
+                 "type": "string",
+                 "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$"
+               }
+             }
+           }
+         }
+       },
+       "allOf": [
+         {
+           "if": {
+             "properties": {
+               "provider": { "const": "custom" }
+             },
+             "required": ["provider"]
+           },
+           "then": {
+             "properties": {
+               "resolutionStrategy": {
+                 "type": "string",
+                 "enum": ["and", "or"]
+               }
+             },
+             "required": ["resolutionStrategy"]
+           }
+         }
+       ]
+     }
    },
    "properties": {
      "consentManagement": {
        "type": "object",
        "properties": {
-         "cloud": {
-           "type": "array",
-           "items": { ... }
-         },
+         "cloud": { "$ref": "#/definitions/consentConfig" },
+         "android": { "$ref": "#/definitions/consentConfig" },
          // ... repeat for other platforms
        }
      }
    }
  }
}

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (1)
src/configurations/destinations/accoil_analytics/schema.json (1)

285-795: Consider adding validation for empty consent arrays.

While the conditional logic for resolution strategy is well implemented, consider adding a minimum length requirement for the consents array when a provider is specified. This would prevent configurations with a provider but no actual consents.

Example validation to add (shown for one platform, apply to all):

{
  "if": {
    "properties": {
      "provider": {
        "type": "string"
      }
    },
    "required": ["provider"]
  },
  "then": {
    "properties": {
      "consents": {
        "minItems": 1
      }
    },
    "required": ["consents"]
  }
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 89d72b2 and 0198392.

📒 Files selected for processing (3)
  • src/configurations/destinations/accoil_analytics/db-config.json (1 hunks)
  • src/configurations/destinations/accoil_analytics/schema.json (1 hunks)
  • src/configurations/destinations/accoil_analytics/ui-config.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/configurations/destinations/accoil_analytics/ui-config.json
  • src/configurations/destinations/accoil_analytics/db-config.json
🧰 Additional context used
📓 Learnings (1)
src/configurations/destinations/accoil_analytics/schema.json (3)
Learnt from: accoilmj
PR: rudderlabs/rudder-integrations-config#1807
File: src/configurations/destinations/accoil_analytics/schema.json:148-284
Timestamp: 2024-12-09T04:17:28.675Z
Learning: The file `src/configurations/destinations/accoil_analytics/schema.json` is autogenerated. Avoid suggesting changes to autogenerated files.
Learnt from: accoilmj
PR: rudderlabs/rudder-integrations-config#1807
File: src/configurations/destinations/accoil_analytics/schema.json:285-795
Timestamp: 2024-12-09T04:17:16.931Z
Learning: The file `src/configurations/destinations/accoil_analytics/schema.json` is autogenerated.
Learnt from: accoilmj
PR: rudderlabs/rudder-integrations-config#1807
File: src/configurations/destinations/accoil_analytics/schema.json:11-147
Timestamp: 2024-12-09T04:17:05.013Z
Learning: The file `src/configurations/destinations/accoil_analytics/schema.json` is autogenerated and should not be manually modified.
🔇 Additional comments (3)
src/configurations/destinations/accoil_analytics/schema.json (3)

1-10: LGTM! Root schema configuration is well-structured.

The schema correctly enforces API key requirements with a secure pattern that supports both direct values and environment variables.


796-844: LGTM! Connection mode configuration is consistent.

The schema correctly enforces cloud-only mode across all platforms, which is appropriate for this analytics destination.


845-858: LGTM! Native SDK configuration is appropriately scoped.

The schema correctly limits native SDK configuration to relevant platforms (web, android, ios) with simple boolean toggles.

@accoilmj accoilmj requested a review from manish339k December 9, 2024 04:32
@accoilmj
Copy link
Author

Hi @manish339k just checking in if there's anything further I need to work on here? Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants